package jvm.concurrent;

/**
 * volatile变量自增运算测试
 *  该关键字不保证有序性和原子性
 * @author msi
 */
public class VolatileTest {

    public static volatile int race = 0;

    public static void increase() {
        race++;
    }

    private static final int THREADS_COUNT = 20;

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREADS_COUNT];
        for (int i = 0; i < THREADS_COUNT; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        increase();
                    }
                }
            });
            threads[i].start();
        }

        // 等待所有累加线程都结束
        while (Thread.activeCount() > 1) {
            Thread.yield();
        }

        System.out.println(race);
    }
}
/**
 * 结果：计算结果小于 200000 这是由于 race++ 操作不是原子操作，包括有取值、修改值、存新值三个操作,不具备原子性。所以结果不对。
 * 由于volatile只能保证可见性，所以在这里只能通过加锁实现线程安全。所以在使用volatile关键字时需要注意。如果对该变量的操作全是原子操作(比如赋值，读取等)就可以使用volatile关键字保证线程安全。
 */
